package com.xzzz.expand.gateway.dr.pojo;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.xzzz.common.base.pojo.RCode;
import lombok.Data;
import org.springframework.util.StringUtils;

import java.io.Serializable;

/**
 * gateway 网关专用返回对象
 */
@Data
public class GwR implements Serializable {
    /**
     * 系统内部自定义的返回值编码  {@link RCode}
     */
    private String code;
    /**
     * 响应说明
     */
    private String  msg;
    /**
     * 异常信息, 无数据时无该字段
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String  ex;
    /**
     * 响应来源, 无数据时无该字段
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String  from;
    /**
     * 响应内容, 无数据时无该字段
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Object data;

    private GwR(){}

    // region 返回成功

    /**
     * 返回成功
     */
    public static GwR ok(){
        return GwR.initR(RCode.SUCCESS.getCode(), RCode.SUCCESS.getMsg(), null, null);
    }

    /** 返回成功
     * @param data 对象类型的data数据
     */
    public static GwR ok(Object data){
        return GwR.initR(RCode.SUCCESS.getCode(), RCode.SUCCESS.getMsg(), null, data);
    }

    // endregion

    // region 返回失败

    /** 50000/自定义响应信息 */
    public static GwR fault(String msg){
        return GwR.initR(RCode.INTERNAL_SERVER_ERROR.getCode(), msg, null, null);
    }

    /**
     * 失败, 自定义响应码和响应信息
     *
     * @param code 响应码
     * @param msg  响应信息
     */
    public static GwR fault(String code, String msg) {
        return GwR.initR(code, msg != null ? clearStr(msg) : RCode.byCode(code).getMsg(), null, null);
    }

    /** 自定义返回值/自定义返回信息 */
    public static GwR fault(String code, String msg, String ex){
        return GwR.initR(code, msg != null ? clearStr(msg) : RCode.byCode(code).getMsg(), ex, null);
    }

    // endregion

    /**
     * 初始化返回对象
     */
    private static GwR initR(String code, String msg, String ex, Object data) {
        GwR r = new GwR();
        r.setCode(code);
        r.setMsg(msg);
        r.setEx(ex);
        r.setData(data);
        return r;
    }

    /**
     * 对返回字符串进行一些格式处理
     * - 例如:
     *   - gateway返回的错误信息都包含双引号,序列化后会有多引号的情况 : ""内容""
     * @param str 字符串对象
     * @return 处理后的对象
     */
    private static String clearStr(String str){
        return StringUtils.replace(str, "\"", "");
    }


    /**
     * 是否成功响应
     * @return 是否成功
     */
    public boolean isOk() {
        return RCode.SUCCESS.getCode().equals(this.code);
    }

}
